/*
   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2
   of the License, or (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   USA. 
*/
#ifndef _LIBC_STRING_H_
#define _LIBC_STRING_H_

#include <types.h>



void *memcpy(void *dst, const void *src, register unsigned int size ) ;
void *memset(void *dst, register int c, register unsigned int length ) ;
int memcmp(const void *s1, const void *s2, size_t n);

unsigned int strlen( register const char *str) ;
unsigned int strnlen(const char * s, size_t maxlen);

/**
 * @note Same as strncpy(), with a slightly different semantic.
 * Actually, strncpy(3C) says " The result will not be null-terminated
 * if the length of 'from' is n or more.".  Here, 'dst' is ALWAYS
 * null-terminated. And its total len will ALWAYS be <= len, with
 * null-terminating-char included.
 */
char *strzcpy( register char *dst, register const char *src,
               register int len ) ;

/**
 * @note Same as strncat(), with the same semantic : 'dst' is ALWAYS
 * null-terminated. And its total len will ALWAYS be <= len, with
 * null-terminating-char included.
 */
char *strzcat (char *dest, const char *src,
               const size_t len);

char *strndup(const char *s, size_t n);
char *strdup(const char *s);
 
int strcmp(register const char *s1, register const char *s2 );
int strncmp(register const char *s1, register const char *s2,
	    register int len );

#define islower(c)  (('a' <= (c)) && ((c) <= 'z'))
#define isupper(c)  (('A' <= (c)) && ((c) <= 'Z'))
#define isdigit(c)  (('0' <= (c)) && ((c) <= '9'))
#define isspace(c)  (((c) == ' ') || ((c) == '\t') || \
                    ((c) == '\f') || ((c) == '\n') || \
                    ((c) == '\r') || ((c) == '\v'))
#define isprint(c)  ((' ' <= (c)) && ((c) <= '~'))

long long int strtoll(const char *nptr, char **endptr, int base);
long int strtol(const char *nptr, char **endptr, int base);
long long atoll(const char *nptr);
long atol(const char *nptr);

#endif /* _LIBC_STRING_H_ */
